
// 1. 封装变量

var mult = function() {
    var a = 1;

    for (let i = 0; i < arguments.length; i++) {
        a = a * arguments[i]
    }

    return a
}

console.log(mult(1,2,3));


// 进一步优化函数，进行缓存

var cache = {}

var mult = function() {

    var args = Array.prototype.join.call(arguments , ",")

    if(cache[args]) {
        return cache[args]
    }

    var a = 1;

    for (let i = 0; i < arguments.length; i++) {
        a = a * arguments[i]
    }

    return cache[args] = a
}
console.time("第一次计算")
console.log(mult(1,2,3));
console.timeEnd("第一次计算")
console.time("第二次计算")
console.log(mult(1,2,3));
console.timeEnd("第二次计算")

// 再进一步优化，因为cache污染了全局变量

var mult = (() => {
    var cache = {}
    return function() {
        var args = Array.prototype.join.call(arguments,",")
        if(cache[args]){
            return cache[args]
        }
        var a = 1
        for (let i = 0; i < arguments.length; i++) {
            a = a * arguments[i]
        }

        return cache[args] = a
    }
})()

console.time("第一次计算")
console.log(mult(1,2,3));
console.timeEnd("第一次计算")
console.time("第二次计算")
console.log(mult(1,2,3));
console.timeEnd("第二次计算")


// 在进行下一步优化提炼

var mult = (()=> {
    var cache = {}

    var calculate = function () {
        var a = 1
        for (let i = 0; i < arguments.length; i++) {
            a = a * arguments[i]
        }

        return a
    }

    return function () {
        var args = Array.prototype.join.call(arguments , ",")

        if(cache[args]){
            return cache[args]
        }

        return cache[args] = calculate.apply(null , arguments)
    }
})()

console.time("第一次计算")
console.log(mult(1,2,3));
console.timeEnd("第一次计算")
console.time("第二次计算")
console.log(mult(1,2,3));
console.timeEnd("第二次计算")